# 线段树 模板

import sys
input = sys.stdin.readline
# tree_sum[o] 表示线段树中编号为o 对应管理的区间之和
tree_sum = [0] * (10**6)
# tree_add[o] 表示线段树中编号为o对应的增量
tree_add = [0] * (10**6)

# 更新当前标记,向上去更新，所以回溯的时候使用
def push_up(o,l,r):
    if l==r:
        return
    lson,rson = o*2,o*2+1
    tree_sum[o] = tree_sum[lson] + tree_sum[rson]


# 1.线段树的建立
# o: 线段树中编号为o的节点,对应管理的区间【l,r】
def build(o,l,r):

    # 递归出口：l==r,叶子节点
    if l==r:
        tree_sum[o] = a[l]
        return
    mid = (l+r) //2
    lson,rson = o*2,o*2+1
    # 对应的左儿子编号为lson,管理区间【l,mid】
    # 对应的右儿子编号为rson，管理区间为【mid+1,r】
    build(lson,l,mid)
    build(rson,mid+1,r)

    # 回溯 , 当前节点的和 = 左节点 + 右节点
    push_up(o,l,r)


# 下发标记
def push_down(o,l,r):
    if l==r:
        return
    mid = (l + r) // 2
    lson, rson = o * 2, o * 2 + 1
    # 左儿子标记更新
    tree_add[lson] += tree_add[o]
    # 左儿子 和 更新
    tree_sum[lson] += tree_add[o] * (mid-l-1)
    # 右儿子标记更新
    tree_add[rson] += tree_add[o]
    tree_sum[rson] += tree_add[o] *(r-mid)  #r-mid+1-1 ：同理
    # 清除当前标记
    tree_add[o]=0


# 区间更新【L,R】加上x
# o: 线段树中编号为o的节点,对应管理的区间【l,r】
def updata_add(o,l,r,L,R,x):
    # 当前点o对应的区间【l,r】是【L,R】的子集，则停止
    if L<=l<=r<=R:
        # 当前区间总和 x * 区间长度
        tree_sum[o] += x*(r-l+1)
        # 打上 +x 的标记
        tree_add[o] += x
        return
    # 向下更新标记
    push_down(o,l,r)
    mid = (l + r) // 2
    lson, rson = o * 2, o * 2 + 1
    # 对应的左儿子编号为lson,管理区间【l,mid】
    # 对应的右儿子编号为rson，管理区间为【mid+1,r】
    # 不是完全覆盖区间【L,R】， 有交集，扩大范围去遍历
    if mid >=L:
        updata_add(lson,l,mid,L,R,x)
    if mid+1 <=R:
        updata_add(rson,mid+1,r,L,R,x)
    # 回溯 去更新 区间和
    push_up(o,l,r)

# 查询区间【L,R】和
# o: 线段树中编号为o的节点,对应管理的区间【l,r】
def query(o,l,r,L,R):
    # 当前点o对应的区间【l,r】是【L,R】的子集，则停止
    if L <= l <= r <= R:
        # 返回 区间和
        return tree_sum[o]
    #向下更新标记
    push_down(o, l, r)

    mid = (l + r) // 2
    lson, rson = o * 2, o * 2 + 1
    res =0
    # 部分覆盖，继续向下 递归
    if mid >= L:
        res += query(lson,l,mid,L,R)
    if mid+1 <= R:
        res += query(rson,mid+1,r,L,R)
    # 回溯
    push_up(o,l,r)
    return res

N,Q = map(int,input().split())
a=[0]+list(map(int,input().split()))
# 建树
build(1,1,N)
for i in range(Q):
    now = list(map(int,input().split()))
    if now[0]==1:
        l,r,x = now[1::]
        updata_add(1,1,N,l,r,x)
    else:
        l,r = now[1::]
        print(query(1,1,N,l,r))